package com.ncr.travel.airline.shared.configuration.converters;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Converts to and from ISO3166 alpha-3 country codes.
 * @author Jon Cordero
 * @author Rob Cooke
 *
 */
public class CountryCodeConverterStubImpl implements CountryCodeConverter {
	private static final Logger logger = LoggerFactory.getLogger(CountryCodeConverter.class);

	// To alpha-3.
	protected final Map<String, String> iso3166Alpha2ToAlpha3;
	protected final Map<String, String> iso3166NumericToAlpha3;

	// From alpha-3.
	protected final Map<String, String> iso3166Alpha3ToAlpha2;
	protected final Map<String, String> iso3166Alpha3ToNumeric;

	/**
	 * Initializes a new instance of the <code>CountryCodeConverter</code> class.
	 */
	public CountryCodeConverterStubImpl() {
		// To alpha-3.
		iso3166Alpha2ToAlpha3 = new HashMap<String, String>();
		iso3166NumericToAlpha3 = new HashMap<String, String>();

		// From alpha-3.
		iso3166Alpha3ToAlpha2 = new HashMap<String, String>();
		iso3166Alpha3ToNumeric = new HashMap<String, String>();

		loadStubData();
	}

	//conversions

	/**
	 * @param alpha3Code
	 * @return
	 */
	@Override
	public String convertIsoAlpha3ToAlpha2(String alpha3Code) {
		String result = iso3166Alpha3ToAlpha2.get(alpha3Code);
		if (result == null) {
			logger.warn("Unmapped ISO3166-1 alpha-3 code: " + alpha3Code);
		}

		return result;
	}

	@Override
	public String convertIsoAlpha2ToAlpha3(String alpha2Code) {
		String result = iso3166Alpha2ToAlpha3.get(alpha2Code);
		if (result == null) {
			logger.warn("Unmapped ISO3166-1 alpha-2 code: " + alpha2Code);
		}
		return result;
	}

	//TODO: add more conversions as needed

	protected void addCountry(String englishName, String alpha2, String alpha3, String numeric) {
		// To alpha-3
		iso3166Alpha2ToAlpha3.put(alpha2, alpha3);
		iso3166NumericToAlpha3.put(numeric, alpha3);

		// From alpha-3.
		iso3166Alpha3ToAlpha2.put(alpha3, alpha2);
		iso3166Alpha3ToNumeric.put(alpha3, numeric);
	}

	/**
	 * 
	 */
	protected void loadStubData() {
		//
		// Yes, I really did type these in by hand. It was more thrilling than a planning meeting.
		// (Actually it was more fun to write some Groovy ^_^)
		//

		// TODO: Move this list to the configuration service.

		addCountry("AALAND ISLANDS", "AX", "ALA", "248");
		addCountry("AFGHANISTAN", "AF", "AFG", "004");
		addCountry("ALBANIA", "AL", "ALB", "008");
		addCountry("ALGERIA", "DZ", "DZA", "012");
		addCountry("AMERICAN SAMOA", "AS", "ASM", "016");
		addCountry("ANDORRA", "AD", "AND", "020");
		addCountry("ANGOLA", "AO", "AGO", "024");
		addCountry("ANGUILLA", "AI", "AIA", "660");
		addCountry("ANTARCTICA", "AQ", "ATA", "010");
		addCountry("ANTIGUA AND BARBUDA", "AG", "ATG", "028");
		addCountry("ARGENTINA", "AR", "ARG", "032");
		addCountry("ARMENIA", "AM", "ARM", "051");
		addCountry("ARUBA", "AW", "ABW", "533");
		addCountry("AUSTRALIA", "AU", "AUS", "036");
		addCountry("AUSTRIA", "AT", "AUT", "040");
		addCountry("AZERBAIJAN", "AZ", "AZE", "031");
		addCountry("BAHAMAS", "BS", "BHS", "044");
		addCountry("BAHRAIN", "BH", "BHR", "048");
		addCountry("BANGLADESH", "BD", "BGD", "050");
		addCountry("BARBADOS", "BB", "BRB", "052");
		addCountry("BELARUS", "BY", "BLR", "112");
		addCountry("BELGIUM", "BE", "BEL", "056");
		addCountry("BELIZE", "BZ", "BLZ", "084");
		addCountry("BENIN", "BJ", "BEN", "204");
		addCountry("BERMUDA", "BM", "BMU", "060");
		addCountry("BHUTAN", "BT", "BTN", "064");
		addCountry("BOLIVIA", "BO", "BOL", "068");
		addCountry("BOSNIA AND HERZEGOWINA", "BA", "BIH", "070");
		addCountry("BOTSWANA", "BW", "BWA", "072");
		addCountry("BOUVET ISLAND", "BV", "BVT", "074");
		addCountry("BRAZIL", "BR", "BRA", "076");
		addCountry("BRITISH INDIAN OCEAN TERRITORY", "IO", "IOT", "086");
		addCountry("BRUNEI DARUSSALAM", "BN", "BRN", "096");
		addCountry("BULGARIA", "BG", "BGR", "100");
		addCountry("BURKINA FASO", "BF", "BFA", "854");
		addCountry("BURUNDI", "BI", "BDI", "108");
		addCountry("CAMBODIA", "KH", "KHM", "116");
		addCountry("CAMEROON", "CM", "CMR", "120");
		addCountry("CANADA", "CA", "CAN", "124");
		addCountry("CAPE VERDE", "CV", "CPV", "132");
		addCountry("CAYMAN ISLANDS", "KY", "CYM", "136");
		addCountry("CENTRAL AFRICAN REPUBLIC", "CF", "CAF", "140");
		addCountry("CHAD", "TD", "TCD", "148");
		addCountry("CHILE", "CL", "CHL", "152");
		addCountry("CHINA", "CN", "CHN", "156");
		addCountry("CHRISTMAS ISLAND", "CX", "CXR", "162");
		addCountry("COCOS (KEELING) ISLANDS", "CC", "CCK", "166");
		addCountry("COLOMBIA", "CO", "COL", "170");
		addCountry("COMOROS", "KM", "COM", "174");
		addCountry("CONGO, Democratic Republic of (was Zaire)", "CD", "COD", "180");
		addCountry("CONGO, Republic of", "CG", "COG", "178");
		addCountry("COOK ISLANDS", "CK", "COK", "184");
		addCountry("COSTA RICA", "CR", "CRI", "188");
		addCountry("COTE D'IVOIRE", "CI", "CIV", "384");
		addCountry("CROATIA (local name: Hrvatska)", "HR", "HRV", "191");
		addCountry("CUBA", "CU", "CUB", "192");
		addCountry("CYPRUS", "CY", "CYP", "196");
		addCountry("CZECH REPUBLIC", "CZ", "CZE", "203");
		addCountry("DENMARK", "DK", "DNK", "208");
		addCountry("DJIBOUTI", "DJ", "DJI", "262");
		addCountry("DOMINICA", "DM", "DMA", "212");
		addCountry("DOMINICAN REPUBLIC", "DO", "DOM", "214");
		addCountry("ECUADOR", "EC", "ECU", "218");
		addCountry("EGYPT", "EG", "EGY", "818");
		addCountry("EL SALVADOR", "SV", "SLV", "222");
		addCountry("EQUATORIAL GUINEA", "GQ", "GNQ", "226");
		addCountry("ERITREA", "ER", "ERI", "232");
		addCountry("ESTONIA", "EE", "EST", "233");
		addCountry("ETHIOPIA", "ET", "ETH", "231");
		addCountry("FALKLAND ISLANDS (MALVINAS)", "FK", "FLK", "238");
		addCountry("FAROE ISLANDS", "FO", "FRO", "234");
		addCountry("FIJI", "FJ", "FJI", "242");
		addCountry("FINLAND", "FI", "FIN", "246");
		addCountry("FRANCE", "FR", "FRA", "250");
		addCountry("FRENCH GUIANA", "GF", "GUF", "254");
		addCountry("FRENCH POLYNESIA", "PF", "PYF", "258");
		addCountry("FRENCH SOUTHERN TERRITORIES", "TF", "ATF", "260");
		addCountry("GABON", "GA", "GAB", "266");
		addCountry("GAMBIA", "GM", "GMB", "270");
		addCountry("GEORGIA", "GE", "GEO", "268");
		addCountry("GERMANY", "DE", "DEU", "276");
		addCountry("GHANA", "GH", "GHA", "288");
		addCountry("GIBRALTAR", "GI", "GIB", "292");
		addCountry("GREECE", "GR", "GRC", "300");
		addCountry("GREENLAND", "GL", "GRL", "304");
		addCountry("GRENADA", "GD", "GRD", "308");
		addCountry("GUADELOUPE", "GP", "GLP", "312");
		addCountry("GUAM", "GU", "GUM", "316");
		addCountry("GUATEMALA", "GT", "GTM", "320");
		addCountry("GUINEA", "GN", "GIN", "324");
		addCountry("GUINEA-BISSAU", "GW", "GNB", "624");
		addCountry("GUYANA", "GY", "GUY", "328");
		addCountry("HAITI", "HT", "HTI", "332");
		addCountry("HEARD AND MC DONALD ISLANDS", "HM", "HMD", "334");
		addCountry("HONDURAS", "HN", "HND", "340");
		addCountry("HONG KONG", "HK", "HKG", "344");
		addCountry("HUNGARY", "HU", "HUN", "348");
		addCountry("ICELAND", "IS", "ISL", "352");
		addCountry("INDIA", "IN", "IND", "356");
		addCountry("INDONESIA", "ID", "IDN", "360");
		addCountry("IRAN (ISLAMIC REPUBLIC OF)", "IR", "IRN", "364");
		addCountry("IRAQ", "IQ", "IRQ", "368");
		addCountry("IRELAND", "IE", "IRL", "372");
		addCountry("ISRAEL", "IL", "ISR", "376");
		addCountry("ITALY", "IT", "ITA", "380");
		addCountry("JAMAICA", "JM", "JAM", "388");
		addCountry("JAPAN", "JP", "JPN", "392");
		addCountry("JORDAN", "JO", "JOR", "400");
		addCountry("KAZAKHSTAN", "KZ", "KAZ", "398");
		addCountry("KENYA", "KE", "KEN", "404");
		addCountry("KIRIBATI", "KI", "KIR", "296");
		addCountry("KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF", "KP", "PRK", "408");
		addCountry("KOREA, REPUBLIC OF", "KR", "KOR", "410");
		addCountry("KUWAIT", "KW", "KWT", "414");
		addCountry("KYRGYZSTAN", "KG", "KGZ", "417");
		addCountry("LAO PEOPLE'S DEMOCRATIC REPUBLIC", "LA", "LAO", "418");
		addCountry("LATVIA", "LV", "LVA", "428");
		addCountry("LEBANON", "LB", "LBN", "422");
		addCountry("LESOTHO", "LS", "LSO", "426");
		addCountry("LIBERIA", "LR", "LBR", "430");
		addCountry("LIBYAN ARAB JAMAHIRIYA", "LY", "LBY", "434");
		addCountry("LIECHTENSTEIN", "LI", "LIE", "438");
		addCountry("LITHUANIA", "LT", "LTU", "440");
		addCountry("LUXEMBOURG", "LU", "LUX", "442");
		addCountry("MACAU", "MO", "MAC", "446");
		addCountry("MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF", "MK", "MKD", "807");
		addCountry("MADAGASCAR", "MG", "MDG", "450");
		addCountry("MALAWI", "MW", "MWI", "454");
		addCountry("MALAYSIA", "MY", "MYS", "458");
		addCountry("MALDIVES", "MV", "MDV", "462");
		addCountry("MALI", "ML", "MLI", "466");
		addCountry("MALTA", "MT", "MLT", "470");
		addCountry("MARSHALL ISLANDS", "MH", "MHL", "584");
		addCountry("MARTINIQUE", "MQ", "MTQ", "474");
		addCountry("MAURITANIA", "MR", "MRT", "478");
		addCountry("MAURITIUS", "MU", "MUS", "480");
		addCountry("MAYOTTE", "YT", "MYT", "175");
		addCountry("MEXICO", "MX", "MEX", "484");
		addCountry("MICRONESIA, FEDERATED STATES OF", "FM", "FSM", "583");
		addCountry("MOLDOVA, REPUBLIC OF", "MD", "MDA", "498");
		addCountry("MONACO", "MC", "MCO", "492");
		addCountry("MONGOLIA", "MN", "MNG", "496");
		addCountry("MONTSERRAT", "MS", "MSR", "500");
		addCountry("MOROCCO", "MA", "MAR", "504");
		addCountry("MOZAMBIQUE", "MZ", "MOZ", "508");
		addCountry("MYANMAR", "MM", "MMR", "104");
		addCountry("NAMIBIA", "NA", "NAM", "516");
		addCountry("NAURU", "NR", "NRU", "520");
		addCountry("NEPAL", "NP", "NPL", "524");
		addCountry("NETHERLANDS", "NL", "NLD", "528");
		addCountry("NETHERLANDS ANTILLES", "AN", "ANT", "530");
		addCountry("NEW CALEDONIA", "NC", "NCL", "540");
		addCountry("NEW ZEALAND", "NZ", "NZL", "554");
		addCountry("NICARAGUA", "NI", "NIC", "558");
		addCountry("NIGER", "NE", "NER", "562");
		addCountry("NIGERIA", "NG", "NGA", "566");
		addCountry("NIUE", "NU", "NIU", "570");
		addCountry("NORFOLK ISLAND", "NF", "NFK", "574");
		addCountry("NORTHERN MARIANA ISLANDS", "MP", "MNP", "580");
		addCountry("NORWAY", "NO", "NOR", "578");
		addCountry("OMAN", "OM", "OMN", "512");
		addCountry("PAKISTAN", "PK", "PAK", "586");
		addCountry("PALAU", "PW", "PLW", "585");
		addCountry("PALESTINIAN TERRITORY, Occupied", "PS", "PSE", "275");
		addCountry("PANAMA", "PA", "PAN", "591");
		addCountry("PAPUA NEW GUINEA", "PG", "PNG", "598");
		addCountry("PARAGUAY", "PY", "PRY", "600");
		addCountry("PERU", "PE", "PER", "604");
		addCountry("PHILIPPINES", "PH", "PHL", "608");
		addCountry("PITCAIRN", "PN", "PCN", "612");
		addCountry("POLAND", "PL", "POL", "616");
		addCountry("PORTUGAL", "PT", "PRT", "620");
		addCountry("PUERTO RICO", "PR", "PRI", "630");
		addCountry("QATAR", "QA", "QAT", "634");
		addCountry("REUNION", "RE", "REU", "638");
		addCountry("ROMANIA", "RO", "ROU", "642");
		addCountry("RUSSIAN FEDERATION", "RU", "RUS", "643");
		addCountry("RWANDA", "RW", "RWA", "646");
		addCountry("SAINT HELENA", "SH", "SHN", "654");
		addCountry("SAINT KITTS AND NEVIS", "KN", "KNA", "659");
		addCountry("SAINT LUCIA", "LC", "LCA", "662");
		addCountry("SAINT PIERRE AND MIQUELON", "PM", "SPM", "666");
		addCountry("SAINT VINCENT AND THE GRENADINES", "VC", "VCT", "670");
		addCountry("SAMOA", "WS", "WSM", "882");
		addCountry("SAN MARINO", "SM", "SMR", "674");
		addCountry("SAO TOME AND PRINCIPE", "ST", "STP", "678");
		addCountry("SAUDI ARABIA", "SA", "SAU", "682");
		addCountry("SENEGAL", "SN", "SEN", "686");
		addCountry("SERBIA AND MONTENEGRO", "CS", "SCG", "891");
		addCountry("SEYCHELLES", "SC", "SYC", "690");
		addCountry("SIERRA LEONE", "SL", "SLE", "694");
		addCountry("SINGAPORE", "SG", "SGP", "702");
		addCountry("SLOVAKIA", "SK", "SVK", "703");
		addCountry("SLOVENIA", "SI", "SVN", "705");
		addCountry("SOLOMON ISLANDS", "SB", "SLB", "090");
		addCountry("SOMALIA", "SO", "SOM", "706");
		addCountry("SOUTH AFRICA", "ZA", "ZAF", "710");
		addCountry("SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS", "GS", "SGS", "239");
		addCountry("SPAIN", "ES", "ESP", "724");
		addCountry("SRI LANKA", "LK", "LKA", "144");
		addCountry("SUDAN", "SD", "SDN", "736");
		addCountry("SURINAME", "SR", "SUR", "740");
		addCountry("SVALBARD AND JAN MAYEN ISLANDS", "SJ", "SJM", "744");
		addCountry("SWAZILAND", "SZ", "SWZ", "748");
		addCountry("SWEDEN", "SE", "SWE", "752");
		addCountry("SWITZERLAND", "CH", "CHE", "756");
		addCountry("SYRIAN ARAB REPUBLIC", "SY", "SYR", "760");
		addCountry("TAIWAN", "TW", "TWN", "158");
		addCountry("TAJIKISTAN", "TJ", "TJK", "762");
		addCountry("TANZANIA, UNITED REPUBLIC OF", "TZ", "TZA", "834");
		addCountry("THAILAND", "TH", "THA", "764");
		addCountry("TIMOR-LESTE", "TL", "TLS", "626");
		addCountry("TOGO", "TG", "TGO", "768");
		addCountry("TOKELAU", "TK", "TKL", "772");
		addCountry("TONGA", "TO", "TON", "776");
		addCountry("TRINIDAD AND TOBAGO", "TT", "TTO", "780");
		addCountry("TUNISIA", "TN", "TUN", "788");
		addCountry("TURKEY", "TR", "TUR", "792");
		addCountry("TURKMENISTAN", "TM", "TKM", "795");
		addCountry("TURKS AND CAICOS ISLANDS", "TC", "TCA", "796");
		addCountry("TUVALU", "TV", "TUV", "798");
		addCountry("UGANDA", "UG", "UGA", "800");
		addCountry("UKRAINE", "UA", "UKR", "804");
		addCountry("UNITED ARAB EMIRATES", "AE", "ARE", "784");
		addCountry("UNITED KINGDOM", "GB", "GBR", "826");
		addCountry("UNITED STATES", "US", "USA", "840");
		addCountry("UNITED STATES MINOR OUTLYING ISLANDS", "UM", "UMI", "581");
		addCountry("URUGUAY", "UY", "URY", "858");
		addCountry("UZBEKISTAN", "UZ", "UZB", "860");
		addCountry("VANUATU", "VU", "VUT", "548");
		addCountry("VATICAN CITY STATE (HOLY SEE)", "VA", "VAT", "336");
		addCountry("VENEZUELA", "VE", "VEN", "862");
		addCountry("VIET NAM", "VN", "VNM", "704");
		addCountry("VIRGIN ISLANDS (BRITISH)", "VG", "VGB", "092");
		addCountry("VIRGIN ISLANDS (U.S.)", "VI", "VIR", "850");
		addCountry("WALLIS AND FUTUNA ISLANDS", "WF", "WLF", "876");
		addCountry("WESTERN SAHARA", "EH", "ESH", "732");
		addCountry("YEMEN", "YE", "YEM", "887");
		addCountry("ZAMBIA", "ZM", "ZMB", "894");
		addCountry("ZIMBABWE", "ZW", "ZWE", "716");
	}
}
